﻿using SupportLayer.Enums;
using SupportLayer.Objetos.Elementos;
using SupportLayer.Objetos.Placa;
using SupportLayer.Util.ExtensionMethods;
using System.Collections.Generic;
using System.Web.UI.WebControls;

namespace TranSys_Web.UCs
{
  public class LoadMensagem
  {
    private int GapHeight;
    private PlacaClass Placa = new PlacaClass();
    private double Divideby;

    public LoadMensagem(int _GapHeight, PlacaClass _placa, double divideby)
    {
      GapHeight = _GapHeight;
      Placa = _placa;
      Divideby = divideby;
    }

    public Panel MensagemSimples(LinhaClass linhaClass, int y, TipoSeta _tipoSeta, bool isOnlyText, bool setaAnteriorEsquerda)
    {
      Panel pnlMensagem = new Panel();

      // Checa qual é a orientação da seta da placa, para gerar as margens e o float corretamente
      switch (_tipoSeta)
      {
        case TipoSeta.S1O:
        case TipoSeta.S1NO:
        case TipoSeta.S1SO:
          pnlMensagem.Style.Add("float", "left");
          if (isOnlyText)
          {
            // Adiciona ao Gap o valor de GapRound dividido por 2 (dois lados da mensagem), pois não há seta
            // Apenas margin-left, não há necessidade de calcular o margin-right
            pnlMensagem.Style.Add("width", "100%");
            pnlMensagem.Style.Add("text-align", "center");
          }
          else
            // Adiciona apenas margin-left, o espaçamento restante ficará a direita, sem necessidade de cálculos
            pnlMensagem.Style.Add("margin-left", (linhaClass.Gap / Divideby).toStringNumber() + "px");
          break;

        case TipoSeta.S1E:
        case TipoSeta.S1NE:
        case TipoSeta.S1SE:
          pnlMensagem.Style.Add("float", "right");
          pnlMensagem.Style.Add("margin-right", (linhaClass.Gap / Divideby).toStringNumber() + "px");
          break;

        default:
        case TipoSeta.S1N:
          if (setaAnteriorEsquerda)
          {
            pnlMensagem.Style.Add("float", "right");
            pnlMensagem.Style.Add("margin-right", (linhaClass.Gap / Divideby).toStringNumber() + "px");
          }
          else
          {
            pnlMensagem.Style.Add("float", "left");
            pnlMensagem.Style.Add("margin-left", (linhaClass.Gap / Divideby).toStringNumber() + "px");
          }
          break;
      }

      if (((MensagemClass)(linhaClass.Elements[y].Element)).isItalic())
        pnlMensagem.Style.Add("font-style", "italic");

      pnlMensagem.Style.Add("height", ((linhaClass.Height + GapHeight) / Divideby).toStringNumber() + "px");
      pnlMensagem.Style.Add("line-height", ((((linhaClass.Height) - 2) + GapHeight) / Divideby).toStringNumber() + "px");

      pnlMensagem.Style.Add("font-family", linhaClass.Fonte);
      pnlMensagem.Style.Add("color", linhaClass.CorTexto);

      // Escreve a mensagem em forma de string na tela
      Label lbl = new Label() { Text = linhaClass.Elements[y].Element.GetValue() };
      lbl.Style.Add("font-size", ((((int)linhaClass.AlturaLetra * 100) / 66) / Divideby).toStringNumber() + "px");
      pnlMensagem.Controls.Add(lbl);

      // Escreve a mensagem letra por letra na tela
      //List<EspacamentoClass> lstEspacamento = new List<EspacamentoClass>();
      //lstEspacamento = linhaClass.Elements[y].Element.GetValue().GetEspacamentos(Placa.AlturaLetra);

      //for (int count = 0; count < lstEspacamento.Count; count++)
      //{
      //  Panel pnlLetter = new Panel();

      //  pnlLetter.Style.Add("float", "left");
      //  pnlLetter.Style.Add("height", linhaClass.Height - Placa.Border * 2 + "px");
      //  pnlLetter.Style.Add("font-size", Convert.ToInt32(Math.Floor((double)((int)Placa.AlturaLetra * 100) / 66)) + "px");

      //  pnlLetter.Controls.Add(new Label() { Text = lstEspacamento[count].Caractere.toStringNumber() });
      //  pnlMensagem.Controls.Add(pnlLetter);
      //}

      return pnlMensagem;
    }

    public Panel MensagemDupla(int posLinha, int y, TipoSeta _tipoSeta, bool setaAnteriorEsquerda, int quantidadeAgrupamentos, bool isOnlyText = false)
    {
      Panel pnlWrapper = new Panel();
      List<Panel> lstMensagens = new List<Panel>();

      for (int x = 0; x <= quantidadeAgrupamentos; x++)
      {
        LinhaClass linhaClass = new LinhaClass();
        linhaClass = Placa.Linhas[posLinha + x];

        Panel pnlMensagem = new Panel();
        // Checa qual é a orientação da seta da placa, para gerar as margens e o float corretamente
        switch (_tipoSeta)
        {
          case TipoSeta.S1O:
            pnlMensagem.Style.Add("float", "left");
            pnlMensagem.Style.Add("width", "100%");
            pnlMensagem.Style.Add("text-align", "center");
            break;

          case TipoSeta.S2NO:
          case TipoSeta.S2SO:
          case TipoSeta.S3O:
            pnlMensagem.Style.Add("float", "left");
            double i = 0;
            linhaClass.Elements.ForEach(a => i += (a.Element is MensagemClass ? linhaClass.Gap / Divideby : (a.Width + linhaClass.Gap) / Divideby));
            pnlMensagem.Style.Add("width", "calc(100% - " + i.toStringNumber() + "px)");
            pnlMensagem.Style.Add("margin-left", (linhaClass.Gap / Divideby).toStringNumber() + "px");
            pnlMensagem.Style.Add("text-align", "left");
            break;

          case TipoSeta.S2NE:
          case TipoSeta.S2SE:
          case TipoSeta.S3E:
            pnlMensagem.Style.Add("float", "right");
            double j = 0;
            linhaClass.Elements.ForEach(a => j += (a.Element is MensagemClass ? linhaClass.Gap / Divideby : (a.Width + linhaClass.Gap) / Divideby));
            pnlMensagem.Style.Add("width", "calc(100% - " + j.toStringNumber() + "px)");
            pnlMensagem.Style.Add("margin-right", (linhaClass.Gap / Divideby).toStringNumber() + "px");
            pnlMensagem.Style.Add("text-align", "right");
            break;
          default:
          case TipoSeta.S2N:
            if (isOnlyText)
            {
              pnlMensagem.Style.Add("float", "right");
              pnlMensagem.Style.Add("width", "100%");
              pnlMensagem.Style.Add("text-align", "center");
            }
            else if (setaAnteriorEsquerda)
            {
              pnlMensagem.Style.Add("float", "right");
              double s2n = 0;
              linhaClass.Elements.ForEach(a => s2n += (a.Element is MensagemClass ? linhaClass.Gap / Divideby : (a.Width + linhaClass.Gap) / Divideby));
              pnlMensagem.Style.Add("width", "calc(100% - " + s2n.toStringNumber() + "px)");
              pnlMensagem.Style.Add("margin-right", (linhaClass.Gap / Divideby).toStringNumber() + "px");
              pnlMensagem.Style.Add("text-align", "right");
            }
            else
            {
              pnlMensagem.Style.Add("float", "left");
              double s2n2 = 0;
              linhaClass.Elements.ForEach(a => s2n2 += (a.Element is MensagemClass ? linhaClass.Gap / Divideby : (a.Width + linhaClass.Gap) / Divideby));
              pnlMensagem.Style.Add("width", "calc(100% - " + s2n2.toStringNumber() + "px)");
              pnlMensagem.Style.Add("margin-left", (linhaClass.Gap / Divideby).toStringNumber() + "px");
              pnlMensagem.Style.Add("text-align", "left");
            }
            break;
        }

        if (((MensagemClass)(linhaClass.Elements[y].Element)).isItalic())
          pnlMensagem.Style.Add("font-style", "italic");

        pnlMensagem.Style.Add("height", ((linhaClass.Height + GapHeight) / Divideby).toStringNumber() + "px");
        pnlMensagem.Style.Add("line-height", ((((linhaClass.Height) - 2) + GapHeight) / Divideby).toStringNumber() + "px");

        if (x > 0)
        {
          pnlMensagem.Style.Add("margin-top", "-" + ((linhaClass.Gap - Placa.Margin) / Divideby).toStringNumber() + "px");
        }

        pnlMensagem.Style.Add("font-family", linhaClass.Fonte);
        pnlMensagem.Style.Add("color", linhaClass.CorTexto);

        // Escreve a mensagem em forma de string na tela
        Label lbl = new Label() { Text = linhaClass.Elements[y].Element.GetValue() };

        if (x < quantidadeAgrupamentos)
          lbl.Text += "<br />";

        lbl.Style.Add("font-size", ((((int)linhaClass.AlturaLetra * 100) / 66) / Divideby).toStringNumber() + "px");
        pnlMensagem.Controls.Add(lbl);

        // Escreve a mensagem letra por letra na tela
        //List<EspacamentoClass> lstEspacamento = new List<EspacamentoClass>();
        //lstEspacamento = linhaClass.Elements[y].Element.GetValue().GetEspacamentos(Placa.AlturaLetra);

        //for (int count = 0; count < lstEspacamento.Count; count++)
        //{
        //  Panel pnlLetter = new Panel();

        //  pnlLetter.Style.Add("float", "left");
        //  pnlLetter.Style.Add("height", linhaClass.Height - Placa.Border * 2 + "px");
        //  pnlLetter.Style.Add("font-size", Convert.ToInt32(Math.Floor((double)((int)Placa.AlturaLetra * 100) / 66)) + "px");

        //  pnlLetter.Controls.Add(new Label() { Text = lstEspacamento[count].Caractere.toStringNumber() });
        //  pnlMensagem.Controls.Add(pnlLetter);
        //}

        lstMensagens.Add(pnlMensagem);
      }

      lstMensagens.ForEach(a => pnlWrapper.Controls.Add(a));

      return pnlWrapper;
    }
  }
}